/* 
 * File:   Nivel.cpp
 * Author: 75.02 - Grupo 7, 2do cuatrimestre 2012.
 * 
 * Created on 31 de octubre de 2012, 18:47
 */

#include <sstream>

#include "Nivel.h"

using namespace TP::Juego::Arena;

Nivel::Nivel(){}

Nivel::Nivel(unsigned id, unsigned anchura, unsigned altura, unsigned tiempo, const std::string &rutaImagenFondo) {
	_escenario = new Escenario(altura, anchura, rutaImagenFondo);
	_id = id;
	_tiempo = tiempo;
}

Nivel::~Nivel() {
    if (_escenario != NULL) {
        delete _escenario;
    }
}

unsigned Nivel::getId() const {
    return _id;
}

unsigned Nivel::getTiempo() const {
    return _tiempo;
}

Escenario* Nivel::getEscenario() {
    return _escenario;
}

bool Nivel::operator==(const Nivel &nivel) {
	return (_id == nivel._id);
}

bool Nivel::operator!=(const Nivel &nivel) {
	return (_id != nivel._id);
}

string Nivel::aXML(){

    TiXmlDocument* doc = new TiXmlDocument();
    TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
    doc->LinkEndChild( decl );
    
    doc->LinkEndChild(this->aElementoXML());

    TiXmlPrinter printer;
    doc->Accept(&printer);
    return printer.CStr();    
}

string Nivel::aXML(const string& pPath){

    TiXmlDocument* doc = new TiXmlDocument(pPath.c_str());
    TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
    doc->LinkEndChild( decl );
    
    doc->LinkEndChild(this->aElementoXML());
    
    TiXmlPrinter printer;
    doc->Accept(&printer);
    return printer.CStr();    
}

void Nivel::parseXML (const string& pDescriptor){

    TiXmlDocument doc;
    doc.Parse(pDescriptor.c_str(), 0, TIXML_ENCODING_UTF8);
    return this->deElementoXML(doc.FirstChildElement());
}

TiXmlElement* Nivel::aElementoXML (){
    
    TiXmlElement * element = new TiXmlElement("Nivel");
    
    std::stringstream stream;
    stream << this->_id;
    element->SetAttribute("id", stream.str().c_str());

    stream.str(std::string());
    stream << this->_tiempo;
    element->SetAttribute("tiempo", stream.str().c_str());
    
    element->LinkEndChild(this->_escenario->aElementoXML());
    
    return element;
}

void Nivel::deElementoXML (TiXmlElement* pElemento){

    if (strcmp (pElemento->Value(), "Nivel") == 0)
    {
        std::stringstream stream;
        stream << pElemento->Attribute("id");
        stream >> this->_id;
        
        stream.str(std::string());
        stream << pElemento->Attribute("tiempo");
        stream >> this->_tiempo;
        
        this->_escenario = new Escenario();
        this->_escenario->deElementoXML(pElemento->FirstChildElement());
    }
}
